<!DOCTYPE html>
<html lang="zh-CN">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>正则表达式</title>
</head>

<body>

  <script src="./index.js"></script>
  <!-- 
        正则表达式：严格区分大小写 匹配第一个满足条件的字符
            正确的 规则的 表达式！
            多用于 数据格式的验证和匹配...

            组成：正则表达式的描述 + 匹配模式(不区分大小写(i)、换行匹配(m)、全局(g))

            特点：代码量少 但是描述信息非常强强大 但是难以阅读...

            正则的数据类型：是一个对象 通过 new 操作符 生成一个实例对象；
                let reg = new RegExp('a') 可动态拼接，生成的正则表达式；
                let reg = /a/ 开发中 常用这种写法 死的正则 不会改变；

            方法：
                test(): 测试是否匹配 返回布尔值...

                exec(): 匹配结果，将结果的信息以数组形式返回出来...匹配不到则返回 null

            匹配：
                1.匹配位置：
                    ^ 匹配开头...写到开头
                    $ 匹配结束...写到末尾

                2.选择：
                    二选一的情况 box | fox
                    [] 单个字符的选择
                    /[bf]ox/
                    [^abc] 只要匹配到 a b c 之外的任意字符 就匹配成功了...
            
            特殊符号：
                \d : 匹配数字
                \D : 匹配任意一个非数字

                \s : 匹配所有的空格、缩进、换行、换页等...
                \S : 匹配任意一个非空格

                \w : 单个任意普通非中文字符
                \W : 匹配任意一个非普通字符

            任意字符：
                . 表示任意字符

            量词：
                描述前面的正则表达式 出现的次数

                贪婪模式：尽可能多的匹配 *
                非贪婪模式：尽可能少的匹配 只需要在量词后面加上个 ？

                正则{最低次数，最高次数}
                /a{20}/ 表示20个连续的 a
                /a{2,10}/ 模糊匹配 表示 2~10个连续的a
                /a{0,5}/ 可能会匹配到 ''

                {0,} <==> * /a*/ 
                {1,} <==> + /a+/
                {0,1} <==> ? 要么有 要么没有
                /\++/ 匹配加号 出现一次及以上的情况...
                /a?/ 匹配a 最多一次 尽可能少的匹配


            括号：
                [] 选择
                {} 量词区间
                () 打包 分组 捕获匹配到的括号里的内容 一个括号就是一个分组；
                可以使用RegExp对象的全局属性 $1 $2 $3...来表示每个分组...

            正则可以参与到 match 或者是 replace 的操作中...

            str.match(/正则/)
            str.replace(/正则/，'替换内容')

            命名捕获组：
                let reg = /(?<年>\d*)-(?<月>\d*)-(?<日>\d*)/
                str.replace(reg,'$<月>/$<日>/$<年>') 可读性更高

            
            断言：推断 预测 非捕获
                (?) 表示断言

                (?<=x)y 前置肯定断言 表示y前面 一定要有x 但是x不需要捕获 ES6的语法
                y(?=x) 后置肯定断言 y后面一定要是x 且x 不需要捕获 ES5的语法

                (?<!x)y 前置否定断言 表示y前面 不是x 就匹配y
                y(?!x) 后置否定断言 表示y后面 不是x 就匹配y

            匹配位置归纳：
                位置：就是相邻字符之间的位置 其实就是空字符

                如何匹配位置：
                    ^ 匹配开头 在多行匹配中 匹配行开头；
                    $ 匹配结尾 多行中 匹配行结尾；

                    \b 单词边界 匹配 \w 和 \W 、 \W 和 ^ 、\w 和 $ 之间的位置；
                    \B 非单词边界 扣掉 \b 的位置 剩下的都是 \B; 也就是 \w~\w 、\W~\W 、^~\W 、 \W~$ 

                    (?=p) 匹配 p 前面的位置；
                    (?<=p) 匹配 p 后面的位置；
                    (?!p) 匹配 除了 p 前面的其他位置；
                    (?<!p) 匹配 除了 p 后面的其他位置；




     -->
</body>

</html>